﻿#region librerías necesarias
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Librerias;
using System.IO;
using System.Drawing.Imaging;
#endregion

namespace eCampus
{
    /// <summary>
    /// Formulario para trabajar con el perfil
    /// </summary>
    public partial class FormPerfil : Form
    {
        #region variables
        /// <summary>
        /// Guarda el usuario que ha ejecutado el formulario
        /// </summary>
        string usuario;
        /// <summary>
        /// Datos del usuario
        /// </summary>
        DataTable datosUsuario;
        /// <summary>
        /// Guardará el directorio
        /// </summary>
        string miDirectorio = @"c:\ecampusTemp\";
        #endregion

        #region Constructores
        /// <summary>
        /// Constructor a partir de un usuario
        /// </summary>
        /// <param name="usr">usuario que ejecuta el programa</param>
        public FormPerfil(string usr)
        {
            InitializeComponent();
            usuario = usr;
            cargaDatosUsuario();
        }
        #endregion

        #region cargaDatosUsuario
        /// <summary>
        /// Cargará el formulario con los datos adecuados
        /// </summary>
        private void cargaDatosUsuario()
        {
            ///para trabajar con usuarios
            ENUsuario usuarioCriado = new ENUsuario();
          
            ///me traerá todos los datos del usuario
            try
            {
                datosUsuario = usuarioCriado.dimeUsuarioSegunCorreo(usuario);
            }
            catch (Exception)
            {
                MessageBox.Show("No se han podido cargar los datos del usuario ");
            }

            ///---traigo los no editables: sólo por el admin
            lbUsuarioActivo.Text = usuario;
            if (datosUsuario.Rows[0][8].ToString() == "0")
            {
                tbTipo.Text = "Administrador";
            }
            else if (datosUsuario.Rows[0][8].ToString() == "1")
            {
                tbTipo.Text = "Profesor";
            }

            tbUsuario.Text = datosUsuario.Rows[0][0].ToString();
            tbNombre.Text = datosUsuario.Rows[0][3].ToString();
            tbDepto.Text = datosUsuario.Rows[0][2].ToString();
            tbApellido1.Text = datosUsuario.Rows[0][4].ToString();
            tbApellido2.Text = datosUsuario.Rows[0][5].ToString();
            tbClave.Text = datosUsuario.Rows[0][1].ToString();
            tbCorreoAlternativoPrimigenio.Text = datosUsuario.Rows[0][9].ToString();
            ///---Meto un icono de ayuda
            pictureBoxInformaError.Image = Bitmap.FromHicon(SystemIcons.Warning.Handle);
           
            ///traigo teléfono: editable
            tbTelefono.Text = datosUsuario.Rows[0][7].ToString();

            #region Cargar Imagen
            ///traigo imagen: editable
            if (datosUsuario.Rows[0][6].ToString().ToString() != "")
            {
                lbPathImagen.Text = datosUsuario.Rows[0][6].ToString();

                //Me preparo el directorio

                try
                {
                    //Si esta lo borro y lo vuelvo a crear
                    if (Directory.Exists(miDirectorio) == true)
                    {
                        Directory.Delete(miDirectorio, true);
                        Directory.CreateDirectory(miDirectorio);
                    }
                    else
                    {
                        Directory.CreateDirectory(miDirectorio);
                    }    
       
                    ///Bajo imagen desde Dropbox
                    usuarioCriado.DescargarImagen(usuario, miDirectorio);

                    ///extracto nombre de la imagen 
                    string[] words = lbPathImagen.Text.Split('/');
                    foreach (string word in words)
                    {
                       cbFicheroDropbox.Items.Add(word);
                    }
                    int numero = cbFicheroDropbox.Items.Count;

                    ///la coloco en el picturebox adecuado
                    string rutaFichero = miDirectorio + (cbFicheroDropbox.Items[numero - 1]).ToString();

                    ///la cargo en el pictureBox
                    FileStream ms;
                    ms = new FileStream(rutaFichero, FileMode.Open, FileAccess.Read);
                    pictImangen.Image = Image.FromStream(ms);
                    ms.Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("No se han podido cargar los datos del Usuario ","Problema");
                }
            }
            #endregion
        }
        #endregion

        #region botón Cancelar
        /// <summary>
        /// Cierra el formulario
        /// </summary>
        /// <param name="sender">btCancelar</param>
        /// <param name="entidadUsuario">Evento click</param>
        private void btCancelar_Click(object sender, EventArgs e)
        {
            Dispose();
        }
        #endregion

        #region botón Guardar
        /// <summary>
        /// Si el usuario lo desea guardará las modificaciones de su perfil
        /// </summary>
        /// <param name="sender">botón btGuardar</param>
        /// <param name="entidadUsuario">Evento click</param>
        private void btGuardar_Click(object sender, EventArgs e)
        {
            #region variables
            //en ppio esta todo bien
            bool todoBien = true;
            //me creo un criado
            ENUsuario criado = new ENUsuario();
            #endregion
            if (lbPathImagen.Text != "PathImagen")
            {
                lbDropbox.Visible = true;
                progressBarSubirFoto.Visible = true;
            }

            //limpio los errores anteriores
            errorProviderPerfil.Clear();

            //01 clave
            if ((tbContrasenya.Text == "") && (tbContrasenya2.Text != ""))
            {
                todoBien = false;
                tbContrasenya2.Text = "";
                tbContrasenya.Focus();
                errorProviderPerfil.SetError(tbContrasenya, "Introduzca una clave y luego repítala");                
            }

            //10 clave
            if (todoBien == true)
            {
                if ((tbContrasenya.Text != "") && (tbContrasenya2.Text == ""))
                {
                    todoBien = false;
                    tbContrasenya2.Focus();
                    errorProviderPerfil.SetError(tbContrasenya2, "Debe repetir su clave");
                }
            }
            //11 clave -> comparo
            if (todoBien == true)
            {
                if ((tbContrasenya.Text != "") && (tbContrasenya2.Text != ""))
                {
                    if (tbContrasenya.Text != tbContrasenya2.Text)
                    {
                        tbContrasenya2.Text = "";
                        tbContrasenya.Text = "";
                        tbContrasenya.Focus();
                        errorProviderPerfil.SetError(tbContrasenya, "Deben coincidir la clave y la clave repetida");
                        todoBien = false;
                    }
                }
            }
            //compruebo el teléfono
            if (todoBien == true)
            {
                if (tbTelefono.Text != "")
                {
                    if (criado.ValidarTelefono(tbTelefono.Text) == false)
                    {
                        tbTelefono.Focus();
                        todoBien = false;
                        errorProviderPerfil.SetError(tbTelefono, "Debe introducir un teléfono válido");
                    }
                }
            }

            //Compruebo correoUsuario alternativo
            if (todoBien == true)
            { 
                //10
                if ((tbCorreoAlternativo.Text != "") && (tbCorreoAlternativo2.Text == ""))
                {
                    tbCorreoAlternativo2.Focus();
                    todoBien = false;
                    errorProviderPerfil.SetError(tbCorreoAlternativo2, "Debe repetir el correo alternativo");
                }
                //01
                if (todoBien == true)
                {
                    if ((tbCorreoAlternativo.Text == "") && (tbCorreoAlternativo2.Text != ""))
                    {
                        todoBien = false;
                        tbCorreoAlternativo2.Text = "";
                        tbCorreoAlternativo.Focus();
                        errorProviderPerfil.SetError(tbCorreoAlternativo, "Introduzca un Correo Alternativo y luego repítalo");
                    }
                }
                //11
                if (todoBien == true)
                {
                    if ((tbCorreoAlternativo2.Text != "") && (tbCorreoAlternativo.Text != ""))
                    {
                        if ((tbCorreoAlternativo.Text != tbCorreoAlternativo2.Text))
                        {
                            todoBien = false;
                            tbCorreoAlternativo2.Text = "";
                            tbCorreoAlternativo.Text = "";
                            tbCorreoAlternativo.Focus();
                            errorProviderPerfil.SetError(tbCorreoAlternativo, "Deben coincidir el Correo Alternativo y el Correo Alternativo repetido");
                        }
                    }
                }

                //Compruebo si es un correoUsuario alternativo correcto
                if (todoBien == true)
                {

                    if (tbCorreoAlternativo.Text != "")
                    {
                        if (criado.ValidarEmail(tbCorreoAlternativo.Text) == false)
                        {
                            todoBien = false;
                            tbCorreoAlternativo2.Text = "";
                            tbCorreoAlternativo.Focus();                            
                            errorProviderPerfil.SetError(tbCorreoAlternativo, "Introduzca un Correo Alternativo Válido");
                        }
                    }                    
                }              
            }

            //Se acabó la fiesta y Guardo si hay cambios
            if (todoBien == true)
            {
                //Guardo lo intocable
                criado.Correo = tbUsuario.Text;
                criado.Nombre = tbNombre.Text;
                criado.Apellido1 = tbApellido1.Text;
                criado.Apellido2 = tbApellido2.Text;
                criado.Departamento = tbDepto.Text;
                if (tbTipo.Text == "Administrador")
                {
                    criado.Tipo = 0;
                }
                else
                    criado.Tipo = 1;

                criado.Contraseña = tbClave.Text;
                criado.CorreoAlternativo = tbCorreoAlternativoPrimigenio.Text;

                //Guardo la clave
                if (tbContrasenya.Text != "")
                {
                    criado.Contraseña = tbContrasenya.Text;
                }

                ///Guardo el timófono
                if (tbTelefono.Text != "")
                {
                    criado.Telefono=tbTelefono.Text;
                }

                ///Guardo el correoUsuario alternativo
                if (tbCorreoAlternativo.Text != "")
                {
                    criado.CorreoAlternativo = tbCorreoAlternativo.Text;
                }

                ///Si han cambiado la foto: la persisto
                if (lbPathImagen.Text != "PathImagen")
                {
                    criado.Imagen = lbPathImagen.Text;
                
                    ///Guardo imagen en DROPBOX
                    lbDropbox.Visible = true;
                    progressBarSubirFoto.Visible = true;

                    try
                    {
                        criado.ModificarUsuario(progressBarSubirFoto);
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("No se han podido cargar los datos del usuario","Problema");
                    }
                }

                Dispose();
            }
        }
        #endregion

        #region Usabilidad Formulario FormPerfil
        private void tbContrasenya_Enter(object sender, EventArgs e)
        {
            tbContrasenya.BackColor = Color.LightYellow;
        }

        private void tbContrasenya_Leave(object sender, EventArgs e)
        {
            tbContrasenya.BackColor = Color.White;
        }

        private void tbContrasenya2_Leave(object sender, EventArgs e)
        {
            tbContrasenya2.BackColor = Color.White;
        }

        private void tbContrasenya2_Enter(object sender, EventArgs e)
        {
            tbContrasenya2.BackColor = Color.LightYellow;
        }

        private void tbTelefono_Enter(object sender, EventArgs e)
        {
            tbTelefono.BackColor = Color.LightYellow;
        }

        private void tbTelefono_Leave(object sender, EventArgs e)
        {
            tbTelefono.BackColor = Color.White;
        }

        private void tbCorreoAlternativo_Enter(object sender, EventArgs e)
        {
            tbCorreoAlternativo.BackColor = Color.LightYellow;
        }

        private void tbCorreoAlternativo_Leave(object sender, EventArgs e)
        {
            tbCorreoAlternativo.BackColor = Color.White;
        }

        private void tbCorreoAlternativo2_Enter(object sender, EventArgs e)
        {
            tbCorreoAlternativo2.BackColor = Color.LightYellow;
        }

        private void tbCorreoAlternativo2_Leave(object sender, EventArgs e)
        {
            tbCorreoAlternativo2.BackColor = Color.White;
        }

        private void btCancelar_MouseHover(object sender, EventArgs e)
        {
            ToolTip queHace = new ToolTip();
            queHace.SetToolTip(btCancelar, "Salir sin realizar cambios");
        }
        #endregion

        #region Foto desde Fichero
        /// <summary>
        /// Carga desde un fichero un jpg al pb
        /// </summary>
        /// <param name="sender">btFotoDesdeFichero</param>
        /// <param name="e">click</param>
        private void btFotoDesdeFichero_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofdFoto = new OpenFileDialog();
            ofdFoto.Filter = "jpg (*.jpg)|*.jpg";
            if (ofdFoto.ShowDialog() == DialogResult.OK)
            {
                pictImangen.Image = System.Drawing.Image.FromFile(ofdFoto.FileName);
                lbPathImagen.Text = ofdFoto.FileName;
            }
        }
        #endregion

        /// <summary>
        /// Carga desde la webcam una foto al pb
        /// </summary>
        /// <param name="sender">btFotoDesdeWebCam</param>
        /// <param name="e">click</param>
        private void btFotoDesdeWebCam_Click(object sender, EventArgs e)
        {
            FormTomaFoto f1 = new FormTomaFoto();
            f1.ShowDialog(this);
            if (f1.quiereLaFoto == true)
            {            
                pictImangen.Image = f1.fotoTomadaWebCam;
                lbPathImagen.Text = "";
                string rutaFichero = miDirectorio + tbUsuario.Text + ".jpg";
                lbPathImagen.Text = rutaFichero;
                f1.fotoTomadaWebCam.Save(lbPathImagen.Text);
            }
            f1.Close();
            f1.Dispose();
        }


 
        #region usabilidad

        /// <summary>
        /// Zoom al doble click en la imagen
        /// </summary>
        /// <param name="sender">pictImangen</param>
        /// <param name="e">Evento Click</param>
        private void pictImangen_Click(object sender, EventArgs e)
        {
            if (pictImangen.Image != null)
            {
                FormZoomFoto f1 = new FormZoomFoto(pictImangen.Image);
                f1.ShowDialog();
                f1.Dispose();
            }
        }

        /// <summary>
        /// Muestra zoom de la foto
        /// </summary>
        /// <param name="sender">picturebox1</param>
        /// <param name="entidadUsuario">Evento click</param>      
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            if (pictImangen.Image != null)
            {
                FormZoomFoto f1 = new FormZoomFoto(pictImangen.Image);
                f1.ShowDialog();
                f1.Dispose();
            }
        }
        /// <summary>
        /// Ayuda pictureBox1
        /// </summary>
        /// <param name="sender">pictureBox1</param>
        /// <param name="e">Mouse Hover</param>
        private void pictureBox1_MouseHover(object sender, EventArgs e)
        {
            if (pictImangen.Image == null)
            {
                ToolTip queHace = new ToolTip();
                queHace.SetToolTip(pictureBox1, "No tiene imagen aún");
            }
            else
            {
                ToolTip queHace = new ToolTip();
                queHace.SetToolTip(pictureBox1, "Haga zoom en su foto");
            }
        }
        /// <summary>
        /// Ayuda btFotoDesdeWebCam
        /// </summary>
        /// <param name="sender">btFotoDesdeWebCam</param>
        /// <param name="e">Mouse Hover</param>
        private void btFotoDesdeWebCam_MouseHover(object sender, EventArgs e)
        {
            ToolTip queHace = new ToolTip();
            queHace.SetToolTip(btFotoDesdeWebCam, "Haga su foto desde su Webcam");
        }

        /// <summary>
        /// Ayuda btFotoDesdeFichero
        /// </summary>
        /// <param name="sender">btFotoDesdeFichero</param>
        /// <param name="e">Mouse Hover</param>
        private void btFotoDesdeFichero_MouseHover(object sender, EventArgs e)
        {
            ToolTip queHace = new ToolTip();
            queHace.SetToolTip(btFotoDesdeFichero, "Suba su foto desde un fichero");
        }

        /// <summary>
        /// Ayuda pata picImangen
        /// </summary>
        /// <param name="sender">picImangen</param>
        /// <param name="e">Mouse Hover</param>
        private void pictImangen_MouseHover(object sender, EventArgs e)
        {
            if (pictImangen.Image==null)
            {
                ToolTip queHace = new ToolTip();
                queHace.SetToolTip(pictImangen, "No tiene imagen aún");
            }
            else
            {
                ToolTip queHace = new ToolTip();
                queHace.SetToolTip(pictImangen, "Su imagen");
            }
        }
        #endregion

        /// <summary>
        /// Si usuario detecta que tiene errores en su ficha de ecampus se lo informa a admin
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (MessageBox.Show("¿ Deseas que Administrador se ponga en contacto con usted para modificar algún dato erróneo?", "Informar a eCampus de errores en mi Perfil No Modificable", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                try
                {
                    ENMensaje mensajeCriado = new ENMensaje(usuario, "admin@ua.es", "Petición de cambio de Datos de Perfil", "He detectado errores en mis datos de Perfil no modificable"+"\r\nPóngase en contacto conmigo para Modificarlos."+"\r\nGracias.", "");
                    mensajeCriado.Enviar();
                    MessageBox.Show("Mensaje enviado convenientemente. El Administrador se pondrá en contacto con usted", "Mensaje enviado", MessageBoxButtons.OK, MessageBoxIcon.Information); 
                }
                catch (Exception)
                    {
                        MessageBox.Show("No ha sido posible enviar el Mensaje a Administrador. Inténtelo de nuevo más tarde.", "Error en el envío de Mensaje");
                    }
            }
        }

        private void FormPerfil_Load(object sender, EventArgs e)
        {

        }
    }
   
      
}
